package jp.gr.java_conf.abagames.bulletml;

import org.w3c.dom.*;

import org.xml.sax.*;

import java.io.*;

import java.lang.reflect.*;

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.parsers.*;


/**
 * UJAXP
 *
 * @since   Feb. 20, 2000
 * @version Jan. 13, 2001
 * @author  ASAMI, Tomoharu (asami@zeomtech.com)
 */
public class UJAXP
{
    private static ErrorHandler errorHandler;

    public static Document getDocument(File file) throws IOException, SAXException, ParserConfigurationException
    {
        return (getDocument(file.toURL()));
    }

    public static Document getDocument(String uri) throws IOException, SAXException, ParserConfigurationException
    {
        return (getDocument(uri, getErrorHandler()));
    }

    public static Document getDocument(URL url) throws IOException, SAXException, ParserConfigurationException
    {
        return (getDocument(url, getErrorHandler()));
    }

    public static Document getDocument(InputStream in)
        throws IOException, SAXException, ParserConfigurationException
    {
        return (getDocument(in, getErrorHandler()));
    }

    public static Document getDocument(InputSource is)
        throws IOException, SAXException, ParserConfigurationException
    {
        return (getDocument(is, getErrorHandler()));
    }

    public static Document getDocument(Reader reader) throws IOException, SAXException, ParserConfigurationException
    {
        return (getDocument(reader, getErrorHandler()));
    }

    public static Document getDocument(File file, ErrorHandler handler)
        throws IOException, SAXException, ParserConfigurationException
    {
        return (getDocument(file.toURL(), handler));
    }

    public static Document getDocument(String uri, ErrorHandler handler)
        throws IOException, SAXException, ParserConfigurationException
    {
        if (handler == null)
        {
            handler = getErrorHandler();
        }

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        builder.setErrorHandler(handler);

        Document doc = builder.parse(uri);

        return (doc);
    }

    public static Document getDocument(URL url, ErrorHandler handler)
        throws IOException, SAXException, ParserConfigurationException
    {
        if (handler == null)
        {
            handler = getErrorHandler();
        }

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        builder.setErrorHandler(handler);

        Document doc = builder.parse(url.toString());

        return (doc);
    }

    public static Document getDocument(InputStream in, ErrorHandler handler)
        throws IOException, SAXException, ParserConfigurationException
    {
        if (handler == null)
        {
            handler = getErrorHandler();
        }

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        builder.setErrorHandler(handler);

        Document doc = builder.parse(in);

        return (doc);
    }

    public static Document getDocument(InputSource is, ErrorHandler handler)
        throws IOException, SAXException, ParserConfigurationException
    {
        if (handler == null)
        {
            handler = getErrorHandler();
        }

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        builder.setErrorHandler(handler);

        Document doc = builder.parse(is);

        return (doc);
    }

    public static Document getDocument(Reader reader, ErrorHandler handler)
        throws IOException, SAXException, ParserConfigurationException
    {
        if (handler == null)
        {
            handler = getErrorHandler();
        }

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        builder.setErrorHandler(handler);

        Document doc = builder.parse(new InputSource(reader));

        return (doc);
    }

    public static Document getValidDocument(File file)
        throws IOException, SAXException, ParserConfigurationException
    {
        return (getValidDocument(file.toURL()));
    }

    public static Document getValidDocument(String uri)
        throws IOException, SAXException, ParserConfigurationException
    {
        return (getValidDocument(uri, getErrorHandler()));
    }

    public static Document getValidDocument(URL url) throws IOException, SAXException, ParserConfigurationException
    {
        return (getValidDocument(url, getErrorHandler()));
    }

    public static Document getValidDocument(InputStream in)
        throws IOException, SAXException, ParserConfigurationException
    {
        return (getValidDocument(in, getErrorHandler()));
    }

    public static Document getValidDocument(InputSource is)
        throws IOException, SAXException, ParserConfigurationException
    {
        return (getValidDocument(is, getErrorHandler()));
    }

    public static Document getValidDocument(Reader reader)
        throws IOException, SAXException, ParserConfigurationException
    {
        return (getValidDocument(reader, getErrorHandler()));
    }

    public static Document getValidDocument(File file, ErrorHandler handler)
        throws IOException, SAXException, ParserConfigurationException
    {
        return (getValidDocument(file.toURL(), handler));
    }

    public static Document getValidDocument(String uri, ErrorHandler handler)
        throws IOException, SAXException, ParserConfigurationException
    {
        if (handler == null)
        {
            handler = getErrorHandler();
        }

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setValidating(true);

        DocumentBuilder builder = factory.newDocumentBuilder();
        builder.setErrorHandler(handler);

        Document doc = builder.parse(uri);

        return (doc);
    }

    public static Document getValidDocument(URL url, ErrorHandler handler)
        throws IOException, SAXException, ParserConfigurationException
    {
        if (handler == null)
        {
            handler = getErrorHandler();
        }

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setValidating(true);

        DocumentBuilder builder = factory.newDocumentBuilder();
        builder.setErrorHandler(handler);

        Document doc = builder.parse(url.toString());

        return (doc);
    }

    public static Document getValidDocument(InputStream in, ErrorHandler handler)
        throws IOException, SAXException, ParserConfigurationException
    {
        if (handler == null)
        {
            handler = getErrorHandler();
        }

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setValidating(true);

        DocumentBuilder builder = factory.newDocumentBuilder();
        builder.setErrorHandler(handler);

        Document doc = builder.parse(in);

        return (doc);
    }

    public static Document getValidDocument(InputSource is, ErrorHandler handler)
        throws IOException, SAXException, ParserConfigurationException
    {
        if (handler == null)
        {
            handler = getErrorHandler();
        }

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setValidating(true);

        DocumentBuilder builder = factory.newDocumentBuilder();
        builder.setErrorHandler(handler);

        Document doc = builder.parse(is);

        return (doc);
    }

    public static Document getValidDocument(Reader reader, ErrorHandler handler)
        throws IOException, SAXException, ParserConfigurationException
    {
        if (handler == null)
        {
            handler = getErrorHandler();
        }

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setValidating(true);

        DocumentBuilder builder = factory.newDocumentBuilder();
        builder.setErrorHandler(handler);

        Document doc = builder.parse(new InputSource(reader));

        return (doc);
    }

    public static Document makeDocument() throws ParserConfigurationException
    {
        return (makeDocument(getErrorHandler()));
    }

    public static Document makeDocument(ErrorHandler handler)
        throws ParserConfigurationException
    {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setValidating(true);

        DocumentBuilder builder = factory.newDocumentBuilder();
        builder.setErrorHandler(handler);

        Document doc = builder.newDocument();

        return (doc);
    }

    public static ErrorHandler getErrorHandler()
    {
        if (errorHandler == null)
        {
            errorHandler = new ErrorHandler()
                    {
                        public void error(SAXParseException e)
                        {
                            System.out.print("error : ");
                            System.out.println(e.getMessage());
                        }

                        public void fatalError(SAXParseException e)
                        {
                            System.out.print("fatal error : ");
                            System.out.println(e.getMessage());
                        }

                        public void warning(SAXParseException e)
                        {
                            System.out.print("warning : ");
                            System.out.println(e.getMessage());
                        }
                    };
        }

        return (errorHandler);
    }

    public static void setErrorHandler(ErrorHandler handler)
    {
        errorHandler = handler;
    }

    // test driver
    public static void main(String[] args) throws Exception
    {
        String className = args[0];
        File file = new File(args[1]);
        Class clazz = Class.forName(className);
        Method setupMethod = clazz.getMethod("setup", new Class[] { File.class });
        Method makeMethod = clazz.getMethod("makeDocument", new Class[0]);
        Object object = clazz.newInstance();
        setupMethod.invoke(object, new Object[] { file });

        Document doc = (Document) makeMethod.invoke(object, new Object[0]);
        System.out.println(URelaxer.doc2String4Data(doc));
    }
}
